@JsonTypeInfo Jackson-এর একটি অ্যানোটেশন যা type metadata (অর্থাৎ, অবজেক্টের ধরণ বা type) JSON-এ যোগ করার জন্য ব্যবহৃত হয়। এটি polymorphic serialization/deserialization পরিচালনা করতে সহায়ক, যেখানে একই প্যারেন্ট ক্লাস বা ইন্টারফেসের বিভিন্ন সাবক্লাস বা ইমপ্লিমেন্টেশন একসাথে কাজ করতে পারে।
Jackson ব্যবহার করার সময় যখন একটি ক্লাসের বিভিন্ন সাবক্লাস থাকে এবং আপনি সেগুলি JSON-এ সঠিকভাবে রূপান্তর করতে চান, তখন @JsonTypeInfo অ্যানোটেশনটি প্রয়োজনীয় টাইপ মেটাডেটা যোগ করতে ব্যবহৃত হয়। এর মাধ্যমে, JSON ডেটার মধ্যে সাবক্লাসের টাইপের তথ্য সংযুক্ত করা হয়, যাতে ডেসিরিয়ালাইজেশনের সময় সঠিক ক্লাসে রূপান্তর করা যায়।
@JsonTypeInfo এর প্যারামিটারসমূহ:
use: টাইপ ইনফরমেশন যেভাবে হবে তা নির্ধারণ করা (যেমন,Id.NAME,Id.CLASS,Id.MINIMAL_CLASSইত্যাদি)।include: টাইপ ইনফরমেশন JSON-এ কোথায় থাকবে (যেমন,As.PROPERTY,As.WRAPPER_OBJECT,As.EXTERNAL_PROPERTY)।property: টাইপ ইনফরমেশন JSON প্রপার্টি হিসেবে কী নামে থাকবে।visible: টাইপ ইনফরমেশন ফিল্ড হিসেবে দৃশ্যমান হবে কিনা তা নির্ধারণ করতে ব্যবহৃত হয়।
@JsonTypeInfo এর ব্যবহার
1. Basic Example: Polymorphism
ধরা যাক, আমাদের একটি Shape প্যারেন্ট ক্লাস রয়েছে এবং তার দুটি সাবক্লাস Circle এবং Rectangle রয়েছে। আমরা চাই, যে JSON ডেটা একে অপরের সাথে interchange করতে পারে এবং সঠিক টাইপ ডেসিরিয়ালাইজ করতে সক্ষম হবে।
কোড উদাহরণ:
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonSubTypes.Type;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME, // টাইপের নাম হিসেবে ব্যবহার হবে (এখানে "name" এর মাধ্যমে)
include = JsonTypeInfo.As.PROPERTY, // টাইপ ইনফরমেশন JSON এর একটি প্রপার্টি হিসেবে থাকবে
property = "shape_type" // টাইপ ইনফরমেশন JSON এ "shape_type" হিসেবে থাকবে
)
@JsonSubTypes({
@Type(value = Circle.class, name = "circle"),
@Type(value = Rectangle.class, name = "rectangle")
})
abstract class Shape {
public abstract double area();
}
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
}
class Rectangle extends Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
}
Serialization Example:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonTypeInfoExample {
public static void main(String[] args) throws Exception {
Shape shape = new Circle(5.0); // Circle এর একটি অবজেক্ট
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(shape);
System.out.println("Serialized JSON: " + json);
}
}
JSON Output:
{
"shape_type": "circle",
"radius": 5.0
}
ব্যাখ্যা:
@JsonTypeInfoব্যবহার করার মাধ্যমেShapeঅবজেক্টেরshape_typeপ্রপার্টি হিসেবে টাইপ ইনফরমেশন (যেমন"circle") JSON-এ যোগ করা হয়েছে।- এটি polymorphic types (এখানে
CircleএবংRectangle) JSON-এর মধ্যে সংযুক্ত করার একটি সহজ উপায়।
2. Deserialization Example
JSON থেকে Shape অবজেক্ট ডেসিরিয়ালাইজ করার সময়, shape_type অনুযায়ী সঠিক সাবক্লাসে রূপান্তর করা হবে।
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonTypeInfoDeserializationExample {
public static void main(String[] args) throws Exception {
String json = "{\"shape_type\":\"circle\",\"radius\":5.0}";
ObjectMapper objectMapper = new ObjectMapper();
Shape shape = objectMapper.readValue(json, Shape.class);
System.out.println("Deserialized Shape: " + shape.getClass().getName());
System.out.println("Area: " + shape.area());
}
}
Output:
Deserialized Shape: Circle
Area: 78.53981633974483
ব্যাখ্যা:
- Jackson JSON থেকে
Shapeঅবজেক্ট ডেসিরিয়ালাইজ করার সময়shape_typeফিল্ডের মান অনুযায়ী সঠিক ক্লাস (Circle) নির্বাচন করেছে।
@JsonTypeInfo এর বিভিন্ন use এবং include অপশন
Jackson-এ @JsonTypeInfo এর বিভিন্ন কনফিগারেশন অপশন রয়েছে, যেগুলি আপনার প্রয়োজন অনুসারে টাইপ ইনফরমেশন কাস্টমাইজ করতে সাহায্য করে:
1. use = JsonTypeInfo.Id.CLASS
এটি ক্লাসের পূর্ণ নাম ব্যবহার করে টাইপ ইনফরমেশন সংযুক্ত করে।
@JsonTypeInfo(
use = JsonTypeInfo.Id.CLASS,
include = JsonTypeInfo.As.PROPERTY,
property = "shape_type"
)
2. include = JsonTypeInfo.As.WRAPPER_OBJECT
এটি JSON এর অবজেক্টের মধ্যে টাইপ ইনফরমেশনকে wrap করে রাখে।
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.WRAPPER_OBJECT,
property = "shape_type"
)
Output (Wrapper Object) Example:
{
"shape_type": {
"radius": 5.0
}
}
3. @JsonSubTypes ব্যবহার
@JsonSubTypes ব্যবহার করে আপনি টাইপ ইনফরমেশন-সহ বিভিন্ন সাবক্লাস নির্দিষ্ট করতে পারেন। এর মাধ্যমে polymorphic deserialization পরিচালনা করা সহজ হয়।
@JsonSubTypes({
@Type(value = Circle.class, name = "circle"),
@Type(value = Rectangle.class, name = "rectangle")
})
@JsonTypeInfo এর সুবিধা
- Polymorphic Serialization এবং Deserialization:
- এটি polymorphic অবজেক্টের ক্ষেত্রে টাইপ ইনফরমেশন JSON-এ সংযুক্ত করতে সহায়ক।
- Type Discriminator:
- JSON ডেটাতে টাইপ ডিসক্রিমিনেটর (type discriminator) যোগ করতে পারে, যা ডেসিরিয়ালাইজেশনের সময় সঠিক ক্লাস নির্বাচন করতে সাহায্য করে।
- Customizable Type Information:
use,include, এবংpropertyএর মাধ্যমে টাইপ ইনফরমেশন কাস্টমাইজ করা যায়।
- Backward Compatibility:
- যখন বিভিন্ন সাবক্লাস ব্যবহার হয়, তখন Jackson আপনাকে সাবক্লাসের টাইপ ইনফরমেশন JSON-এ সঠিকভাবে অন্তর্ভুক্ত করতে সহায়তা করে, যা পরিবর্তনশীল ডেটা ফরম্যাট বা API পরিবর্তনগুলোর জন্য সহায়ক।
@JsonTypeInfoঅ্যানোটেশনটি polymorphic serialization এবং deserialization-এর জন্য অত্যন্ত উপকারী। এটি JSON-এ টাইপ ইনফরমেশন সংযুক্ত করে, যার ফলে Jackson সঠিক সাবক্লাস ডেসিরিয়ালাইজ করতে সক্ষম হয়।- এর মাধ্যমে, আপনি বিভিন্ন ধরনের অবজেক্টের সাথে কাজ করার জন্য JSON ডেটার স্ট্রাকচার এবং টাইপ কাস্টমাইজ করতে পারেন।
@JsonSubTypesএবং@JsonTypeInfoএর সঠিক ব্যবহার polymorphic object handling সহজ করে তোলে।
Read more